﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;

namespace PSE.Framework.Versions.Common
{
    public class RegistryUtil
    {
        private static object _lock = new object();
        private static RegistryUtil _instance;
        private RegistryUtil() { }
        public static RegistryUtil Instance
        {
            get
            {
                lock (_lock)
                {
                    if (_instance == null)
                        _instance = new RegistryUtil();

                    return _instance; 
                }
            }
        }

        public string GetValue(string path, string keyName)
        {
            return GetValue(path, keyName, true);
        }

        public string GetValue(string path, string keyName, bool throwException)
        {
            if (string.IsNullOrEmpty(path))
                throw new Exception("Caminho do Registro não informado");

            if (string.IsNullOrEmpty(keyName))
                throw new Exception("Chave do Registro não informada");

            var key = Registry.LocalMachine.OpenSubKey(path);
            if (key == null)
            {
                if (throwException)
                    throw new Exception(string.Format("Não fói possível encontrar o caminho {0} no Registro", path));
                else
                    return string.Empty;
            }

            object @value = key.GetValue(keyName);
            if (@value == null)
            {
                if (throwException)
                    throw new Exception(string.Format("Não fói possível encontrar a chave {0} no caminho {1} do Registro", keyName, path));
                else
                    return string.Empty;
            }
            return @value.ToString();
        }

        public IList<string> GetFolders(string path)
        {
            try
            {
                if (string.IsNullOrEmpty(path))
                    throw new ArgumentNullException("Caminho do Registro não informado");

                var key = Registry.LocalMachine.OpenSubKey(path);
                if (key == null)
                    throw new Exception(string.Format("Não fói possível encontrar o caminho {0} no Registro", path));

                return key.GetSubKeyNames();

            }
            catch (Exception ex)
            {
                //ErrorLogger.WriteLog(LogType.Error, ex);
            }
            return null;
        }

        public Dictionary<string, string> GetStringValues(string rootPath)
        {
            Dictionary<string, string> stringValues = new Dictionary<string, string>();

            try
            {
                if (string.IsNullOrEmpty(rootPath))
                    throw new ArgumentNullException("Caminho do Registro não informado");

                var key = Registry.LocalMachine.OpenSubKey(rootPath);
                if (key == null)
                    throw new Exception(string.Format("Não foi possível encontrar o caminho {0} no Registro", rootPath));

                string[] values = key.GetValueNames();
                foreach (string value in values)
                {
                    stringValues.Add(value, RegistryUtil.Instance.GetValue(rootPath, value));
                }
            }
            catch (Exception ex)
            {
                //ErrorLogger.WriteLog(LogType.Error, ex);
            }
            return stringValues;
        }
    }
}
